home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tech Arsenal 1
/
Tech Arsenal (Arsenal Computer).ISO
/
tek-03
/
zcom10.zip
/
ZCOMTEST.BAS
< prev
next >
Wrap
BASIC Source File
|
1992-02-15
|
8KB
|
242 lines
DEFINT A-Z
DECLARE FUNCTION ZCOM% (BYVAL vseg%, BYVAL voff%)
'------------------------------------------------------------------------
'ZCOM is a very small modem module written in assembly language that will
'work with any 80x86 compiler language capable of passing a far pointer by
'value to an external object. This interface example is in QuickBASIC.
'Note: I'm not providing any documentation other than what is in this
'source code example. If you can't figure it out from this then you
'need more study. After all, yesterday I knew next to nothing about
'serial communications. Nothing to it.
'ZCOM is Copyright (C)1992 Cornel Huth, All Rights Reserved.
'ZCOMTEST is Copyright (C)1992 Cornel Huth
'15-Feb-1992
'
'Any use of this package beyond the first use requires that you register.
'To register, write by letter or postcard:
'
'Print your name and complete mailing address.
'Computer hardware you use--be specific.
'Operating systems you use and years experience with them; your favorite.
'Compilers you use and years experience with them; your favorite.
'Have you written any shareware programs? Specify.
'Have you registered any shareware programs? Specify.
'
'Mail your registration to:
'
' Cornel Huth
' 6402 INGRAM RD
' SAN ANTONIO, TX 78238-3915 U.S.A.
'
'You won't regret it.
'--------------------
TYPE DialModemPackTYPE
Func AS INTEGER 'function to perform 0,1,2
stat AS INTEGER 'status of function, currently always 0
BasePort AS INTEGER 'address of COM device, e.g., &H02F8
IRQ AS INTEGER 'IRQ of COM device, 3 or 4 only
Baud AS INTEGER 'speed of device 300-115,200bps
ComParms AS INTEGER 'line control register value (see below)
BufferSize AS INTEGER 'size of input buffer
BufferPtrOff AS INTEGER 'offset of input buffer (data from modem)
BufferPtrSeg AS INTEGER 'segment
InPtrOff AS INTEGER 'offset of input buffer's current index
InPtrSeg AS INTEGER 'segment
StringPtrOff AS INTEGER 'offset of output buffer (data to modem)
StringPtrSeg AS INTEGER 'segment
END TYPE
DIM DMP AS DialModemPackTYPE 'DMP is what ZCOM uses
'ComParms value derived from:
'
' bits 7 6 543 2 1 0
' Rez BREAK Parity Stop Word
' 0 1=SPC 000=None 0=1 10=7
' 001=Odd 1=2 11=8
' 011=Even
'For example:
'N18 = 00000011 binary, or 2 (no parity, 1 stop bit, 8-bit word)
'E17 = 00011010b, or 1Ah, or 26 decimal (even parity, 1 stop bit, 7-bit word)
DIM SHARED InIndex AS INTEGER 'input index of buffer (used by ZCOM)
DIM SHARED OutIndex AS INTEGER 'output index of buffer (used by ZCOMTEST)
DIM SHARED Buffer AS STRING * 64 'the input buffer filled by the ISR
DIM SHARED Strg AS STRING * 40 'string passed to modem for modem to output
DIM SHARED ZSTR AS STRING * 1 '0T (CHR$(0)) passed string must end with 0T
DIM SHARED CRLF AS STRING * 2 'CHR$(13)+CHR$(10) needed by most modem strngs
CLS
ZSTR = CHR$(0) '0T zero-terminator
CRLF = CHR$(13) + CHR$(10)
InIndex = 0 'when InIndex=OutIndex the input buffer is empty and thus
OutIndex = 0 'there's nothing to output from the modem
DMP.Func = 0 '0=install ZCOM function
DMP.stat = 0
DMP.BasePort = &H2F8 'COM2 default port address
DMP.IRQ = 3 'COM2 default IRQ
DMP.Baud = 2400
DMP.ComParms = 2 '8N1
DMP.BufferSize = LEN(Buffer)
DMP.BufferPtrOff = VARPTR(Buffer)
DMP.BufferPtrSeg = VARSEG(Buffer)
DMP.InPtrOff = VARPTR(InIndex)
DMP.InPtrSeg = VARSEG(InIndex)
DMP.StringPtrOff = VARPTR(Strg)
DMP.StringPtrSeg = VARSEG(Strg)
stat = ZCOM(VARSEG(DMP), VARPTR(DMP))
PRINT "Install stat:"; stat
PRINT "Press Esc to exit dialing!"
DO
'A ~ (ASCII 126) in a modem string instructs ZCOM to pause 1/2 second.
'It really should only be used before an AT command or after the CRLF.
'For example, in "ATDT2~2~6~-3~2~3~2" + CRLF + ZSTR, the half-second
'delays will not affect the dial delay between numbers--use the modem's
'built-in delay for that: , (comma).
'wait 1/2 second, send hangup string, wait 1 second
DMP.Func = 2 '2=write to modem function
Strg = "~~ATH0" + CRLF + "~~" + ZSTR
stat = ZCOM(VARSEG(DMP), VARPTR(DMP))
GOSUB ReadBuffer
'send dial string
DMP.Func = 2
Strg = "ATDT615-6853" + CRLF + ZSTR
stat = ZCOM(VARSEG(DMP), VARPTR(DMP))
'track modem response
'here just check for likely reponses that we care about
Trap = 0
IsBusy = 0
IsConnect = 0
IsNoCarrier = 0
DO
GOSUB ReadBuffer
IF Trap = 0 THEN
SELECT CASE inchar
CASE 66 'B-USY
Trap = 1
CASE 67 'C-ONNECT
Trap = 11
CASE 78 'N-O CARRIER
Trap = 21
CASE ELSE
END SELECT
ELSE
SELECT CASE Trap
CASE IS <= 10
IF CHR$(inchar) = MID$("BUSY", Trap + 1, 1) THEN
Trap = Trap + 1
IF Trap = 4 THEN IsBusy = -1: Trap = 0
END IF
CASE IS <= 20
IF CHR$(inchar) = MID$("CONNECT", Trap - 10 + 1, 1) THEN
Trap = Trap + 1
IF Trap = 17 THEN IsConnect = -1: Trap = 0
END IF
CASE IS <= 30
IF CHR$(inchar) = MID$("NO CARRIER", Trap - 20 + 1, 1) THEN
Trap = Trap + 1
IF Trap = 30 THEN IsNoCarrier = -1: Trap = 0
END IF
CASE ELSE
Trap = 0
END SELECT
END IF
GOSUB WriteChar
IF outchar = 27 THEN EXIT DO
LOOP UNTIL IsBusy OR IsConnect OR IsNoCarrier
IF outchar = 27 THEN EXIT DO
LOOP WHILE IsBusy OR IsNoCarrier
'if we got a CONNECT then make like a terminal (crude one, anyway)
IF IsConnect THEN
DMP.Func = 2 'wait a 1/2 second for connect speed (1200,2400,etc)
Strg = "~" + ZSTR
stat = ZCOM(VARSEG(DMP), VARPTR(DMP))
GOSUB ReadBuffer
PRINT "Press F7 to hangup!" 'any extended key hangs up here
DO
GOSUB ReadBuffer
GOSUB WriteChar
LOOP UNTIL outchar < 0 'hit an extended key and we hangup! See WriteChar
END IF
'switch to command mode, wait 1 second before, 1 second after (at least)
'--1 second is usually enough but may need to be longer depending on the
'modem's configuration.
DMP.Func = 2
Strg = "~~+++~~" + ZSTR
stat = ZCOM(VARSEG(DMP), VARPTR(DMP))
GOSUB ReadBuffer
'send hangup string then wait 1 second
DMP.Func = 2
Strg = "ATH0" + CRLF + "~~" + ZSTR
stat = ZCOM(VARSEG(DMP), VARPTR(DMP))
GOSUB ReadBuffer
'uninstall ZCOM
DMP.Func = 1 '0=uninstall ZCOM function
stat = ZCOM(VARSEG(DMP), VARPTR(DMP)) 'you must call this before exiting
GOSUB ReadBuffer
PRINT "Uninstall stat:"; stat
END
'----------------------------------------
'read incoming characters from the buffer
'put there by the ZCOM ISR
ReadBuffer:
DO WHILE OutIndex <> InIndex
inchar = ASC(MID$(Buffer, OutIndex + 1, 1))
SELECT CASE inchar
CASE 13
PRINT
CASE 10
CASE 8, 127 'do a backspace, however it's done in BASIC
CASE IS < 32
CASE ELSE
PRINT CHR$(inchar);
END SELECT
OutIndex = OutIndex + 1
IF OutIndex = DMP.BufferSize THEN OutIndex = 0
LOOP
RETURN
'-----------------------------------------
'write the character, if any, to the modem
WriteChar:
k$ = INKEY$
SELECT CASE LEN(k$)
CASE 1 'only standard keys here
outchar = ASC(k$)
Strg = k$ + ZSTR
DMP.Func = 2
stat = ZCOM(VARSEG(DMP), VARPTR(DMP))
CASE 2
outchar = -1
CASE ELSE
outchar = 0
END SELECT
RETURN